package com.ly.base.chapter02.BBBClosure;

/**
 * 闭包
 *
 * 1、什么是闭包？
 int main = 0;
 *          函数对象和它外界变量绑定在一起。
 * 2、闭包的限制？
 *          闭包变量必须是 final 或 effective final(不用final修饰但是后续也不会被更改)
 * 3、闭包的作用？
 *          给函数执行提供数据的手段。
 *
 */
public class ClosureDemo1 {

    @FunctionalInterface
    interface Lambda{
        int op(int y);
    }

    static void highOrder(Lambda lambda){System.out.println(lambda.op(1));}

    public static void main(String[] args) {
        /*
            函数对象 (int y) -> X+Y 与它外部的变量形成了闭包

            effective final(不加final但是后续也不被修改的变量)
            （同时后续修改的话，函数对象会报错的）
         */
//        final int x = 10;//不能被重新赋值(规范写法要加final)
//        highOrder((int y) -> x+y);
        Student stu = new Student(20);
        highOrder(y -> y + stu.d);
//        stu = new Student(40); 如果发生改变，会报错的
        //but 以下破坏不可变性
        Lambda lambda = y -> y+stu.d;
        highOrder(lambda);
        stu.d = 40;
        highOrder(lambda);
    }

    static class Student{
        int d;

        public Student(int d){
            this.d = d;
        }
    }

    static int a = 1;
    int b = 2;

    public void test(int c){
        highOrder(y -> a+y);
        highOrder(y -> b+y);
        highOrder(y -> c+y);
    }


}
